Nama  : Muhammad Lukman!Nurhakim
NPM   : 202510715211
Kelas : F2A1
​Penjelasan
​Program ini dibuat untuk menyelesaikan permasalahan dalam menemukan jalur terpendek atau langkah minimum untuk keluar dari sebuah labirin (maze). Input program berupa matriks dua dimensi yang merepresentasikan peta labirin, di mana terdapat titik awal (mulai), jalan yang bisa dilewati, dinding/penghalang, dan titik keluar. Program akan menganalisis rute menggunakan algoritma pencarian jalur untuk menemukan jalan keluar yang paling efektif.
​Hasil akhir akan ditampilkan dalam format:
s#i: x
​Dimana:
​i adalah nomor kasus atau baris input peta
​x adalah jumlah langkah minimum yang dibutuhkan untuk mencapai jalan keluar (atau -1 jika tidak ada jalan keluar)
​Tujuan
​Tujuan dari program ini adalah untuk memahami konsep representasi graf atau matriks dalam pemrograman, mempelajari implementasi algoritma pencarian seperti Breadth-First Search (BFS) untuk pencarian jalur terpendek, serta mengasah logika pemecahan masalah kompleks menggunakan Python.
​Bahasa yang Digunakan
​Python



from collections import deque

def cari_jalan_keluar():
    print("Masukkan labirin berbentuk matriks (misal 0 untuk jalan, 1 untuk dinding).")
        print("Gunakan 'S' untuk Start dan 'E' untuk Exit.")
            print("Ketik 'exit' setelah memasukkan labirin untuk memproses.\n")

                kasus_ke = 1

                    while True:
                            print(f"--- Input Kasus #{kasus_ke} ---")
                                    labirin = []

                                            # Membaca input labirin baris demi baris hingga user mengetik 'done' atau 'exit'
                                                    while True:
                                                                baris_input = input("Masukkan baris (atau ketik 'done'/'exit' jika selesai): ").strip()
                                                                            if baris_input.lower() == 'exit':
                                                                                            print("Program selesai. Terima kasih!")
                                                                                                            return
                                                                                                                        if baris_input.lower() == 'done':
                                                                                                                                        break
                                                                                                                                                    if baris_input:
                                                                                                                                                                    # Mengubah input string menjadi list karakter
                                                                                                                                                                                    labirin.append(baris_input.split())

                                                                                                                                                                                            if not labirin:
                                                                                                                                                                                                        print("Labirin kosong, silakan masukkan data kembali.\n")
                                                                                                                                                                                                                    continue

                                                                                                                                                                                                                            # Mencari koordinat Start (S) dan Exit (E)
                                                                                                                                                                                                                                    start = None
                                                                                                                                                                                                                                            exit_pos = None
                                                                                                                                                                                                                                                    baris_maks = len(labirin)
                                                                                                                                                                                                                                                            kolom_maks = len(labirin[0])

                                                                                                                                                                                                                                                                    for r in range(baris_maks):
                                                                                                                                                                                                                                                                                for c in range(kolom_maks):
                                                                                                                                                                                                                                                                                                if labirin[r][c] == 'S':
                                                                                                                                                                                                                                                                                                                    start = (r, c)
                                                                                                                                                                                                                                                                                                                                    elif labirin[r][c] == 'E':
                                                                                                                                                                                                                                                                                                                                                        exit_pos = (r, c)

                                                                                                                                                                                                                                                                                                                                                                if not start or not exit_pos:
                                                                                                                                                                                                                                                                                                                                                                            print("Error: Karakter 'S' (Start) atau 'E' (Exit) tidak ditemukan!\n")
                                                                                                                                                                                                                                                                                                                                                                                        continue

                                                                                                                                                                                                                                                                                                                                                                                                # --- Algoritma BFS untuk mencari jalur terpendek ---
                                                                                                                                                                                                                                                                                                                                                                                                        queue = deque([(start[0], start[1], 0)]) # Menyimpan data: (baris, kolom, jumlah_langkah)
                                                                                                                                                                                                                                                                                                                                                                                                                dikunjungi = set([start])
                                                                                                                                                                                                                                                                                                                                                                                                                        langkah_minimum = -1

                                                                                                                                                                                                                                                                                                                                                                                                                                # Arah gerakan: Atas, Bawah, Kiri, Kanan
                                                                                                                                                                                                                                                                                                                                                                                                                                        arah = [(-1, 0), (1, 0), (0, -1), (0, 1)]

                                                                                                                                                                                                                                                                                                                                                                                                                                                while queue:
                                                                                                                                                                                                                                                                                                                                                                                                                                                            r, c, langkah = queue.popleft()

                                                                                                                                                                                                                                                                                                                                                                                                                                                                        # Jika sudah sampai di titik Exit (E)
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    if (r, c) == exit_pos:
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    langkah_minimum = langkah
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    break

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                # Cek ke 4 arah gerakan
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            for dr, dc in arah:
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            nr, nc = r + dr, c + dc

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            # Pastikan koordinat baru tidak keluar dari batas labirin
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            if 0 <= nr < baris_maks and 0 <= nc < kolom_maks:
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                # Pastikan belum pernah dikunjungi dan BUKAN dinding ('1')
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    if (nr, nc) not in dikunjungi and labirin[nr][nc] != '1':
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            dikunjungi.add((nr, nc))
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    queue.append((nr, nc, langkah + 1))

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            # Menampilkan hasil sesuai format s#i: x
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    print(f"\ns#{kasus_ke}: {langkah_minimum}\n")
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            kasus_ke += 1

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            # Menjalankan program
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            if __name__ == "__main__":
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                cari_jalan_keluar()